package com.EAsystem.utils;

import com.EAsystem.entity.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;

/**
 * Session管理工具类
 * 提供统一的session操作方法
 */
public class SessionUtils {

    /**
     * 用户信息在session中的key
     */
    public static final String USER_SESSION_KEY = "loggedInUser";

    /**
     * 默认session超时时间（秒）
     */
    public static final int DEFAULT_SESSION_TIMEOUT = 30 * 60; // 30分钟

    /**
     * 获取当前登录用户
     * @param request HttpServletRequest对象
     * @return 当前登录用户，如果未登录返回null
     */
    public static User getCurrentUser(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session == null) {
            return null;
        }
        return (User) session.getAttribute(USER_SESSION_KEY);
    }

    /**
     * 获取当前登录用户
     * @param session HttpSession对象
     * @return 当前登录用户，如果未登录返回null
     */
    public static User getCurrentUser(HttpSession session) {
        if (session == null) {
            return null;
        }
        return (User) session.getAttribute(USER_SESSION_KEY);
    }

    /**
     * 设置当前登录用户
     * @param request HttpServletRequest对象
     * @param user 用户对象
     */
    public static void setCurrentUser(HttpServletRequest request, User user) {
        HttpSession session = request.getSession(true);
        session.setAttribute(USER_SESSION_KEY, user);
        session.setMaxInactiveInterval(DEFAULT_SESSION_TIMEOUT);
    }

    /**
     * 设置当前登录用户
     * @param session HttpSession对象
     * @param user 用户对象
     */
    public static void setCurrentUser(HttpSession session, User user) {
        session.setAttribute(USER_SESSION_KEY, user);
        session.setMaxInactiveInterval(DEFAULT_SESSION_TIMEOUT);
    }

    /**
     * 检查用户是否已登录
     * @param request HttpServletRequest对象
     * @return true表示已登录，false表示未登录
     */
    public static boolean isLoggedIn(HttpServletRequest request) {
        return getCurrentUser(request) != null;
    }

    /**
     * 检查用户是否已登录
     * @param session HttpSession对象
     * @return true表示已登录，false表示未登录
     */
    public static boolean isLoggedIn(HttpSession session) {
        return getCurrentUser(session) != null;
    }

    /**
     * 获取当前用户角色
     * @param request HttpServletRequest对象
     * @return 用户角色，如果未登录返回null
     */
    public static Integer getCurrentUserRole(HttpServletRequest request) {
        User user = getCurrentUser(request);
        return user != null ? user.getRole() : null;
    }

    /**
     * 获取当前用户角色
     * @param session HttpSession对象
     * @return 用户角色，如果未登录返回null
     */
    public static Integer getCurrentUserRole(HttpSession session) {
        User user = getCurrentUser(session);
        return user != null ? user.getRole() : null;
    }

    /**
     * 获取当前用户ID
     * @param request HttpServletRequest对象
     * @return 用户ID，如果未登录返回null
     */
    public static Integer getCurrentUserId(HttpServletRequest request) {
        User user = getCurrentUser(request);
        return user != null ? user.getId() : null;
    }

    /**
     * 获取当前用户ID
     * @param session HttpSession对象
     * @return 用户ID，如果未登录返回null
     */
    public static Integer getCurrentUserId(HttpSession session) {
        User user = getCurrentUser(session);
        return user != null ? user.getId() : null;
    }

    /**
     * 获取当前用户名
     * @param request HttpServletRequest对象
     * @return 用户名，如果未登录返回null
     */
    public static String getCurrentUsername(HttpServletRequest request) {
        User user = getCurrentUser(request);
        return user != null ? user.getUsername() : null;
    }

    /**
     * 获取当前用户名
     * @param session HttpSession对象
     * @return 用户名，如果未登录返回null
     */
    public static String getCurrentUsername(HttpSession session) {
        User user = getCurrentUser(session);
        return user != null ? user.getUsername() : null;
    }

    /**
     * 检查当前用户是否为管理员
     * @param request HttpServletRequest对象
     * @return true表示是管理员，false表示不是
     */
    public static boolean isAdmin(HttpServletRequest request) {
        Integer role = getCurrentUserRole(request);
        return role != null && role == 1;
    }

    /**
     * 检查当前用户是否为管理员
     * @param session HttpSession对象
     * @return true表示是管理员，false表示不是
     */
    public static boolean isAdmin(HttpSession session) {
        Integer role = getCurrentUserRole(session);
        return role != null && role == 1;
    }

    /**
     * 检查当前用户是否为教师
     * @param request HttpServletRequest对象
     * @return true表示是教师，false表示不是
     */
    public static boolean isTeacher(HttpServletRequest request) {
        Integer role = getCurrentUserRole(request);
        return role != null && role == 2;
    }

    /**
     * 检查当前用户是否为教师
     * @param session HttpSession对象
     * @return true表示是教师，false表示不是
     */
    public static boolean isTeacher(HttpSession session) {
        Integer role = getCurrentUserRole(session);
        return role != null && role == 2;
    }

    /**
     * 检查当前用户是否为学生
     * @param request HttpServletRequest对象
     * @return true表示是学生，false表示不是
     */
    public static boolean isStudent(HttpServletRequest request) {
        Integer role = getCurrentUserRole(request);
        return role != null && role == 3;
    }

    /**
     * 检查当前用户是否为学生
     * @param session HttpSession对象
     * @return true表示是学生，false表示不是
     */
    public static boolean isStudent(HttpSession session) {
        Integer role = getCurrentUserRole(session);
        return role != null && role == 3;
    }

    /**
     * 用户登出
     * @param request HttpServletRequest对象
     */
    public static void logout(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
    }

    /**
     * 用户登出
     * @param session HttpSession对象
     */
    public static void logout(HttpSession session) {
        if (session != null) {
            session.invalidate();
        }
    }

    /**
     * 刷新session过期时间
     * @param request HttpServletRequest对象
     */
    public static void refreshSession(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.setMaxInactiveInterval(DEFAULT_SESSION_TIMEOUT);
        }
    }

    /**
     * 刷新session过期时间
     * @param session HttpSession对象
     */
    public static void refreshSession(HttpSession session) {
        if (session != null) {
            session.setMaxInactiveInterval(DEFAULT_SESSION_TIMEOUT);
        }
    }

    /**
     * 获取角色名称
     * @param role 角色代码
     * @return 角色名称
     */
    public static String getRoleName(Integer role) {
        if (role == null) {
            return "未知";
        }
        switch (role) {
            case 1:
                return "管理员";
            case 2:
                return "教师";
            case 3:
                return "学生";
            default:
                return "未知";
        }
    }

    /**
     * 获取当前用户角色名称
     * @param request HttpServletRequest对象
     * @return 角色名称
     */
    public static String getCurrentUserRoleName(HttpServletRequest request) {
        Integer role = getCurrentUserRole(request);
        return getRoleName(role);
    }

    /**
     * 获取当前用户角色名称
     * @param session HttpSession对象
     * @return 角色名称
     */
    public static String getCurrentUserRoleName(HttpSession session) {
        Integer role = getCurrentUserRole(session);
        return getRoleName(role);
    }

    /**
     * 获取当前用户真实姓名
     * @param request HttpServletRequest对象
     * @return 真实姓名，如果未登录返回null
     */
    public static String getCurrentUserRealName(HttpServletRequest request) {
        User user = getCurrentUser(request);
        return user != null ? user.getRealName() : null;
    }

    /**
     * 获取当前用户真实姓名
     * @param session HttpSession对象
     * @return 真实姓名，如果未登录返回null
     */
    public static String getCurrentUserRealName(HttpSession session) {
        User user = getCurrentUser(session);
        return user != null ? user.getRealName() : null;
    }
}